package com.lamada.demo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

/**
 * <p>
 *
 * </p>
 *
 * @author qingshan
 * @since 2020-12-27 16:33
 */
public class stream1 {

    public static void main(String[] args) {
//        baseUse();
        parallelCompare();
    }

    /**
     * 1. 基本使用方法
     *      foreach
     *      findFirst
     *      findAny
     *      anyMatch
     */
    static void baseUse(){
        List<Integer> list = Arrays.asList(7, 6, 9, 3, 8, 2, 1);

        // 遍历输出符合条件的元素
        list.stream().filter(x -> x > 6).forEach(System.out::println);
        // 匹配第一个
        Optional<Integer> findFirst = list.stream().filter(x -> x > 6).findFirst();
        // 匹配任意（适用于并行流）
        Optional<Integer> findAny = list.parallelStream().filter(x -> x > 6).findAny();
        // 是否包含符合特定条件的元素
        boolean anyMatch = list.stream().anyMatch(x -> x < 6);
        System.out.println("匹配第一个值：" + findFirst.get());
        System.out.println("匹配任意一个值：" + findAny.get());
        System.out.println("是否存在大于6的值：" + anyMatch);
    }

    /**
     * 2. 属性流和并行流效率对比
     */
    static void parallelCompare(){
        List<Integer> list = new ArrayList<>();
        for(int i = 1; i <= 1000001; i++){
            list.add(i);
            i++;
        }
        long start = System.currentTimeMillis();
        Optional<Integer> findFirst = list.stream().filter(x -> x > 1000000).findFirst();
        System.out.println("匹配第一个值：" + findFirst.get());
        long end = System.currentTimeMillis();
        System.out.println("属性流时间：" + (end - start));

        long start1 = System.currentTimeMillis();
        Optional<Integer> findFirst1 = list.parallelStream().filter(x -> x > 1000000).findAny();
        System.out.println("匹配第一个值：" + findFirst1.get());
        long end1 = System.currentTimeMillis();
        System.out.println("属性流时间：" + (end1 - start1));
    }
}
